var WSDL = "/SilverRiver/services/WebService"; // "Constante"
var urlPartida = "/WebSilverRiver/juego.jsp?id=[idPartida]&b=[bando]&c=[creador]&i=[idioma]"; // "Constante"

var idPartida = ""; // Id de la partida que creó o a la que se unió el usuario
var creador = false; // Indica si el usuario es, o no. el creador de la partida.
var bando = ""; // Indica el bando que eligió el usuario para jugar.
var idioma = "es";
var idiomas = new Object();

/**
 * Devuelve un objeto XML a partir de un string conteniendo un documento XML.
 * Trata de eliminar la dependencia del browser para los métodos que utilicen XML.
 * @param _soap String El documento XML
 * @returns objeto XML
 */
function darXML(_soap) {
	var xml;
	if (_soap.xml) { // IE
        xml = _soap.xml;
	} else { // MOZ, etc
    	xml = (new XMLSerializer()).serializeToString(_soap);
	}
    return xml;
}

/**
 * Carga una partida guardada a partir de un código de partida
 * 
 * @param _codPartida
 */
function cargarJuego(_codPartida, _callback, _error) {
	var voCargarPartida = new SOAPClientParameters();
	voCargarPartida.add("_codigoPartida", _codPartida);
	mostrarCargando();
	SOAPClient.invoke(WSDL, "cargarPartida", voCargarPartida, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
		if ($xml.find("nombreBando").length > 0) {
	    	bando = $xml.find("nombreBando").text();
	    	idPartida = $xml.find("codigoPartida").text();
	    	creador = true;
	    	if (typeof _callback == 'function') {
		    	_callback($xml);
	    	}
    	} else {
    		alert(idiomas[idioma].diccionario["errorCargaPartida"]);
    		if (typeof _callback == 'function') {
		    	_error($xml);
	    	}
    	}
	});
}

/**
 * Crea una partida con los datos ingresados por el usuario en el formulario
 * @param _callback Función que se llama al terminar el proceso exitosamente
 * @param _error Función que se llama al terminar el proceso con error
 */
function crearPartida(_callback, _error) {
	var nombrePartida = $.trim($("#nomPartida").val());
	var dificultad = $.trim($("#dificultad option:selected").val());
	var idioma = $.trim($("#idioma option:selected").val());
	var nombreJugador = $.trim($("#nomJugador").val());
	var nombreBando = $.trim($("#nomBando option:selected").val());
	var errores = [];

	if (nombrePartida == "" || nombrePartida.lenth > 16) {
		errores.push(idiomas[idioma].diccionario["errorNombrePartida"]);
	}

	if (nombreJugador == "" || nombreJugador.length > 16) {
		errores.push(idiomas[idioma].diccionario["errorNombreJugador"]);
	}

	if (errores.length == 0) {
		var voCrearPartida = new SOAPClientParameters();
		voCrearPartida.add("_nombrePartida", nombrePartida);
		voCrearPartida.add("_dificultad", dificultad);
		voCrearPartida.add("_idioma", idioma);
		voCrearPartida.add("_nombreJugador", nombreJugador);
		voCrearPartida.add("_nombreBando", nombreBando);

		mostrarCargando();
	    SOAPClient.invoke(WSDL, "crearPartida", voCrearPartida, true, function(_response, _soap) {
	    	ocultarCargando();
			var xml = darXML(_soap);
	    	var $xml = $($.parseXML(xml));
	    	var respuesta = $xml.find("crearPartidaReturn").text();
	    	if (respuesta.indexOf("ERROR::") < 0) { // Salió todo bien
	    		idPartida = respuesta;
	    		bando = $("#nomBando option:selected").val();
	    		creador = true;
	    		if (typeof _callback == 'function') {
			    	_callback($xml);
		    	}
	    	} else {
	    		alert("Ocurrió un error: " + respuesta.substr(7));
	    		if (typeof _error == 'function') {
			    	_error($xml);
		    	}
	    	}
	    });
	} else {
		alert("Ocurrieron errores: " + String.fromCharCode(10) + errores.join(String.fromCharCode(10)));
	}
}

/**
 * Obtiene un listado de partidas desde el webservice
 * @param _callback Función a ser llamada al finalizar la consulta
 */
function obtenerListadoPartidas(_callback) {
	var vacio = new SOAPClientParameters();
	mostrarCargando();
	SOAPClient.invoke(WSDL, "listarPartidas", vacio, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $.parseXML(xml);
		if (typeof _callback == 'function') {
    		_callback($($xml));
    	}
    });
}

/**
 * Muestra el listado de partidas obtenido desde el webservice
 * @param _callback Función que se llama al terminar el proceso exitosamente
 */
function mostrarPartidas (_callback) {
	mostrarCargando();
	obtenerListadoPartidas(function(_$xml) {
		ocultarCargando();
		var partidas = 0;
		$("#listadoPartidas").empty();
		_$xml.find("listarPartidasReturn").each(function() {
    		var bandos = 0;
    		var cargada = $(this).find("cargada").text() == "true";
    		var infoBandos = "";
    		$(this).find("jugadores").find("jugadores").each(function() {
    			bandos++;
    			infoBandos +=
'<div class="bandoInfo">\
    <span class="blanco negrita">' + idiomas[idioma].diccionario["jugador"] + ': </span>' + $(this).find("nombre").text() +
    ' - <span class="blanco negrita">' + idiomas[idioma].diccionario["unido"] + ': </span>' + ($(this).find("unido").text().toLowerCase() == "true"? idiomas[idioma].diccionario["si"] : idiomas[idioma].diccionario["no"]) +
    ' - <span class="blanco negrita">' + idiomas[idioma].diccionario["bando"] + ': </span>' + $(this).find("nombreBando").text() +
'</div>';
    		});
    		
    		var html =
    			'<tr class="itemJuego" id="juego--' + $(this).find("codigo").text() + '">\
    				<td>' + $(this).find("nombrePartida").text() + '</td>\
    				<td>' + bandos + '</td>\
    				<td>' + ($(this).find("iniciada").text() != "false"? "Sí" : "No") + '</td>\
    			</tr>\
    			<tr style="display:none" class="infoItem" id="infoItem--' + $(this).find("codigo").text() + '">\
    				<td colspan="4">\
    					' + infoBandos +'\
    				<p>';
    				if ($(this).find("iniciada").text() != "true") {
    					html += '<a href="#" class="boton unirAJuego' + (cargada? "Cargado" : "") + '" id="unir--' + $(this).find("codigo").text() + '">' + idiomas[idioma].diccionario["unirme"] + '!</a>';
    				}
    				html += '</p>\
    				</td>\
    			</tr>';
    		$("#listadoPartidas").append(html);
    		$("#partidas").show();
    		partidas++;
		});
		ocultarTodo();
		if (partidas > 0) {
			$("#listado").show();
		} else {
			$("#listadoVacio").show();
		}
		$("#controles").show();
		if (typeof _callback == 'function') {
    		_callback();
    	}
	});
}

/**
 * Oculta todos los elementos dinámicos de la página
 */
function ocultarTodo() {
	$("#formularioCargar").hide();
	$("#datosPartida").hide();
	$("#datosJugador").hide();
	$("#crearPartida").hide();	
	$("#unirAPartida").hide();
	$("#listadoVacio").hide();
	$("#controles").hide();
	$("#cancelar").hide();
}

/**
 * Agrega un jugador a una partida cargada a partir del codigo de carga que se le da al usuario. 
 * @param _idCarga
 * @param _callback
 * @param _error
 */
function agregarBandoAPartidaCargada(_idCarga, _callback, _error) {
	var voAgregarBando = new SOAPClientParameters();
	voAgregarBando.add("_codigoPartidaBando", _idCarga);
	mostrarCargando();
	SOAPClient.invoke(WSDL, "agregarJugadorPartidaCargada", voAgregarBando, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
    	
    	if ($xml.find("nombreBando").length > 0) {
	    	bando = $xml.find("nombreBando").text();
	    	idPartida = $xml.find("codigoPartida").text();
	    	if (typeof _callback == 'function') {
		    	_callback($xml);
	    	}
    	} else {
    		alert(idiomas[idioma].diccionario["errorCargaPartida"]);
    		if (typeof _callback == 'function') {
		    	_error($xml);
	    	}
    	}
	});
}

/**
 * Agrega un bando a la partida a partir de los datos del formulario completado por el usuario
 * @param _callback Función que se llama al terminar el proceso exitosamente
 * @param _error Función que se llama al terminar el proceso con error
 */
function agregarBando(_callback, _error) {
	var idPartidaLocal = $.trim($("#idPartida").val());
	var idioma = $("#idioma option:selected").val();
	var nombreJugador = $.trim($("#nomJugador").val());
	var nombreBando = $("#nomBando option:selected").val();
	var errores = [];

	if (nombreJugador == "" || nombreJugador.length > 16) {
		errores.push(idiomas[idioma].diccionario["errorNombreJugador"]);
	}

	if (errores.length == 0) {
		var voAgregarBando = new SOAPClientParameters();
		voAgregarBando.add("_codigoPartida", idPartidaLocal);
		voAgregarBando.add("_idioma", idioma);
		voAgregarBando.add("_nombreJugador", nombreJugador);
		voAgregarBando.add("_nombreBando", nombreBando);
		mostrarCargando();
		SOAPClient.invoke(WSDL, "agregarJugador", voAgregarBando, true, function(_response, _soap) {
			ocultarCargando();
			var xml = darXML(_soap);
	    	var $xml = $($.parseXML(xml));
	    	var respuesta = $xml.find("agregarJugadorReturn").text();
	    	if (respuesta.indexOf("ERROR::") < 0) { // Salió todo bien
	    		idPartida = $.trim($("#idPartida").val());
	    		bando = $("#nomBando option:selected").val();
	    		if (typeof _callback == 'function') {
		    		_callback($xml);
		    	}
	    	} else {
	    		alert("Ocurrió un error: " + respuesta.substr(7));
	    		if (typeof _error == 'function') {
		    		_error($xml);
		    	}
	    	}
	    });
	}
}

/**
 * Inicia la consulta periódica del estado de la partida (iniciada o no) y  los bandos agregados a ella.
 */
function iniciarConsulta(_cargada) {
	if (typeof _cargada == 'undefined') _cargada = false;
	
	ocultarTodo();
	// Muestro un cuadro con la partida a la que se unió el usuario
	$("#infoPartida").html($("#juego--" + idPartida).next().html());
	$("#mensajeEspera .unirAJuego").remove();
	$("#motrarFormularioPartida").remove();
	$("#mensajeEspera").show();
	$("#partidas").hide();
	$("#mostrarFormularioPartida").hide();
	
	if (_cargada) {
		actualizarDatosPartidaCargada();
	} else { 
		actualizarDatosPartida();
	}
}

/**
 * Actualiza los datos de la partida mientras el usuario espera.
 * Si la partida fue iniciada, redirige a la página de juego.
 */
function actualizarDatosPartida () {
	var parametros = new SOAPClientParameters();
	parametros.add("_codigoPartida", idPartida);
	SOAPClient.invoke(WSDL, "datosPreinicio", parametros, true, function(_response, _soap) {
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
		if ($xml.find("iniciada").text() == "true") {
			location.href = urlPartida
				.replace(/\[idPartida\]/, idPartida)
				.replace(/\[bando\]/, bando)
				.replace(/\[creador\]/, creador? "true" : "false")
				.replace(/\[idioma\]/, idioma);
		} else {
			var html = "";
			$xml.find("jugadores").find("jugadores").each(function() {
    			html +=
    				'<p align="right"><div class="bandoInfo"><span class="blanco negrita">' +
					idiomas[idioma].diccionario["jugador"] + ': </span>' +
					$(this).find("nombre").text() + ' - <span class="blanco negrita">' +
					idiomas[idioma].diccionario["bando"] + ': </span>' +
					$(this).find("nombreBando").text() + '</div></p>';
    		});
			if (creador) html +=
				'<div id="inicarLaPartida"><a href="#" class="boton"> ' +
				idiomas[idioma].diccionario["iniciarBatalla"] + ' </a></div>';
			$("#infoPartida").html(html);
			setTimeout("actualizarDatosPartida();", 1000);
		}
    });
}

/**
 * Actualiza los datos de la partida mientras el usuario espera.
 * Si la partida fue iniciada, redirige a la página de juego.
 */
function actualizarDatosPartidaCargada() {
	var parametros = new SOAPClientParameters();
	parametros.add("_codigoPartida", idPartida);
	SOAPClient.invoke(WSDL, "datosPreinicioCarga", parametros, true, function(_response, _soap) {
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
    	if ($xml.find("iniciada").text() == "true") {
    		location.href = urlPartida
				.replace(/\[idPartida\]/, idPartida)
				.replace(/\[bando\]/, bando)
				.replace(/\[creador\]/, creador? "true" : "false")
				.replace(/\[idioma\]/, idioma);
		} else {
			var html = "";

			html = '<div class="bandoInfo">' + idiomas[idioma].diccionario["mensajeEsperaCargada"]
				.replace(/\[unidos\]/, $xml.find("jugadoresUnidos").text())
				.replace(/\[esperados\]/, $xml.find("jugadoresEsperados").text()) + '</div>';

			if (creador) html +=
				'<div id="inicarLaPartida"><a href="#" class="boton"> ' +
				idiomas[idioma].diccionario["iniciarBatalla"] + ' </a></div>';
			$("#infoPartida").html(html);
			setTimeout("actualizarDatosPartidaCargada();", 1000);
		}
    });
}

/**
 * Inicia la partida. Sólo el creador del juego puede llamar a esta función.
 */
function iniciarPartida() {
	var parametros = new SOAPClientParameters();
	parametros.add("_codigoPartida", idPartida);
	mostrarCargando();
	SOAPClient.invoke(WSDL, "iniciarPartida", parametros, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
    	var respuesta = $xml.find("iniciarPartidaReturn").text();
    	if (respuesta != "OK") {
    		alert("Ocurrió un error: " + respuesta.substr(7));
    	}
	});
}

/**
 * Obtiene todos los diccionarios para todos los idiomas del juego y los carga en el array de idiomas
 */
function obtenerTextos(_callback) {
	var parametros = new SOAPClientParameters();
	mostrarCargando();
	SOAPClient.invoke(WSDL, "textosIdiomas", parametros, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
    	$("#barraIdiomas").empty();
    	$xml.find("textosIdiomasReturn").each(function() {
    		var codigoIdioma = $(this).find("codigo").text();
    		idiomas[codigoIdioma] = new Object();
    		idiomas[codigoIdioma]["nombre"] = $(this).find("nombre").text();
    		idiomas[codigoIdioma]["diccionario"] = new Object();

    		$(this).find("diccionario").each(function() {
    			idiomas[codigoIdioma]["diccionario"][$(this).find("clave").text()] =
    				$(this).find("texto").text();
    		});
    		$("#barraIdiomas").append(
				'<a href="#" class="selIdioma" id="idioma-' + codigoIdioma + '" title="' + $(this).find("nombre").text() + '">[' + $(this).find("nombre").text() + ']</a>'
			);
    	});
    	if (typeof _callback == 'function') {
    		_callback($xml);
    	}
	});
}

/**
 * Actualiza todos los textos del juego al idioma que se pasa por parámetro.
 * @param _idioma
 */
function mostrarTextos(_idioma) {
	$("#idioma").empty();
	$("#nomBando").empty();
	for (var i in idiomas) {
		$("#idioma").append(
			'<option value="' + i + '"' + (_idioma == i? ' selected="selected"' : '') + '> ' + idiomas[i]["nombre"] + ' </option>'
		);
	}
	$("#nomBando").append('<option value="Rojo">' + idiomas[_idioma]["diccionario"]["rojo"] + '</option>');
	$("#nomBando").append('<option value="Azul">' + idiomas[_idioma]["diccionario"]["azul"] + '</option>');
	$("#nomBando").append('<option value="Verde">' + idiomas[_idioma]["diccionario"]["verde"] + '</option>');
	
	for (i in idiomas[_idioma]["diccionario"]) {
		$(".txt-" + i).html(idiomas[_idioma]["diccionario"][i]);
	}
}

/**
 * Muestra el mensaje de carga 
 */
function mostrarCargando() {
	$("#divCargando").show();
}

/**
 * Oculta el mensaje de carga
 */
function ocultarCargando() {
	$("#divCargando").hide();
}

/**
 * Guarda la partida en juego
 */
function guardarPartida() {
	var parametros = new SOAPClientParameters();
	parametros.add("_codigoPartida", idPartida);
	mostrarCargando();
	SOAPClient.invoke(WSDL, "guardarPartida", parametros, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
    	var respuesta = $xml.find("guardarPartidaReturn").text();
    	if (respuesta.indexOf("ERROR::") < 0) { // Salió todo bien
    		if (typeof _callback == 'function') {
		    	_callback($xml);
	    	}
    	} else {
    		alert("Ocurrió un error: " + respuesta.substr(7));
    		if (typeof _error == 'function') {
		    	_error($xml);
	    	}
    	}
	});
}

/**
 * Abandona la partida en juego
 */
function abandonarPartida(_callback, _error) {
	var parametros = new SOAPClientParameters();
	parametros.add("_codigoPartida", idPartida);
	parametros.add("_bando", bando);
	mostrarCargando();
	SOAPClient.invoke(WSDL, "abandonarPartida", parametros, true, function(_response, _soap) {
		ocultarCargando();
		var xml = darXML(_soap);
    	var $xml = $($.parseXML(xml));
    	var respuesta = $xml.find("abandonarPartidaReturn").text();
    	
    	if (respuesta.indexOf("ERROR::") < 0) { // Salió todo bien
    		if (typeof _callback == 'function') {
		    	_callback($xml);
	    	}
    	} else {
    		alert("Ocurrió un error: " + respuesta.substr(7));
    		if (typeof _error == 'function') {
		    	_error($xml);
	    	}
    	}
	});
}

function redireccionarGanador() {
	location.href = "/WebSilverRiver/ganador.jsp?i=" + idioma;
}

function redireccionarPerdedor() {
	location.href = "/WebSilverRiver/perdedor.jsp?i=" + idioma;
}